home *** CD-ROM | disk | FTP | other *** search
- Subject: Re: Bug report. MiNT 1.07; more init patches...
- Date: Thu, 2 Sep 93 16:15:46 CES
- From: Juergen Lock <nox@jelal.north.de>
- Message-Id: <9309021415.AA00378@jelal.north.de>
-
- Juergen Lock writes:
-
- > > Machine:- TT030, 8MB RAM (4+4), standard TT Hard drive + ICD adaptor and
- > > 85MB seagate drive on ACSI bus.
- > >
- > > (1) When opening serial ports modem2, serial1 and serial2, modem1 is opened.
- >
- > hmm haven't seen that one... actually my uucico (taylor 1.03) just
- > received this mail over modem2, without any problems. this is MiNT 1.09...
-
- i forgot to say this is a megaSTe, maybe the bug is >68000 specific...
-
- anyway, i now have halt working again (searches init now) and made init
- sync minixfs and don't wait for TSRs when killed. and syslogd now forks
- itself into background to reduce fragmentation a bit.
-
- diff -ru .b/halt/Makefile ./halt/Makefile
- --- .b/halt/Makefile Thu Aug 5 21:53:48 1993
- +++ ./halt/Makefile Wed Sep 1 17:15:00 1993
- @@ -2,7 +2,7 @@
-
- SHELL = /bin/sh
-
- -CPPFLAGS = -I../include
- +CPPFLAGS = -I../include -DMINT
-
- EXTRALIBS = ../lib/libusers.a ../syslog/libsyslog.a
-
- diff -ru .b/halt/halt.c ./halt/halt.c
- --- .b/halt/halt.c Wed Sep 1 16:30:04 1993
- +++ ./halt/halt.c Thu Sep 2 14:45:36 1993
- @@ -2,10 +2,66 @@
- #include <signal.h>
- #include <sys/syslog.h>
-
- +#ifdef MINT
- +#include <ioctl.h>
- +#include <sys/dir.h>
- +
- +typedef unsigned long ulong;
- +
- +typedef struct _context {
- + long regs[15]; /* registers d0-d7, a0-a6 */
- + long usp; /* user stack pointer (a7) */
- + short sr; /* status register */
- + long pc; /* program counter */
- + long ssp; /* supervisor stack pointer */
- + long term_vec; /* GEMDOS terminate vector (0x102) */
- +
- +/* these fields were added in MiNT 0.9 */
- + char fstate[216]; /* FPU internal state */
- + char fregs[12*8]; /* registers fp0-fp7 */
- + long fctrl[3]; /* FPCR/FPSR/FPIAR */
- + short sfmt; /* stack frame format identifier */
- + long iar; /* instruction address */
- + short internal[4]; /* four words of internal info */
- +} CONTEXT;
- +
- +struct pinfo {
- + long magic;
- + char *base;
- + short pid, ppid, pgrp;
- + short ruid, rgid;
- + short euid, egid;
- + short memflags;
- + short pri;
- + short wait_q;
- + long wait_cond;
- + /* (all times are in milliseconds) */
- + ulong systime; /* time spent in kernel */
- + ulong usrtime; /* time spent out of kernel */
- + ulong chldstime; /* children's kernel time */
- + ulong chldutime; /* children's user time */
- +
- + ulong maxmem; /* max. amount of memory to use */
- + ulong maxdata; /* max. data region for process */
- + ulong maxcore; /* max. core memory for process */
- + ulong maxcpu; /* max. cpu time to use */
- +
- + short domain; /* process domain (TOS or MiNT) */
- + short curpri; /* current priority (nice) */
- +};
- +#endif
- +
- main(argc, argv)
- int argc;
- char *argv[];
- {
- +#ifdef MINT
- + int pid, initpid;
- + DIR *procdir;
- + struct direct *entry;
- + char *pointer;
- +#endif
- +
- if (getuid() != 0)
- {
- printf("You need to be root to run halt.\n");
- @@ -19,8 +75,52 @@
- syslog(LOG_NOTICE, "halted by root");
- closelog();
-
- +#ifdef MINT
- + if ((procdir = opendir("u:/proc")) == NULL)
- + {
- + perror("opendir: u:/proc");
- + }
- + else
- + {
- + /* look for process called init with ppid 0
- + */
- + while ((entry = readdir(procdir)) != NULL)
- + {
- + char statf[0x80] = "u:/proc/";
- + int fd;
- +
- + entry->d_name[entry->d_namlen] = '\0';
- + pointer = strchr(entry->d_name, '.');
- + sscanf(++pointer, "%3d", &pid);
- + strcpy (statf+sizeof "u:/proc", entry->d_name);
- + if (!strncmp
- + (entry->d_name, "init.", pointer-1-entry->d_name) &&
- + (fd = open (statf, 0)) >=0) {
- + long place;
- + long ctxtsize;
- + struct pinfo proc;
- +
- + ioctl(fd, PPROCADDR, &place);
- + if (ioctl(fd, PCTXTSIZE, &ctxtsize) < 0) {
- + lseek(fd, place+4+2*sizeof(CONTEXT), 0);
- + } else
- + lseek(fd, place, 0);
- + read(fd, &proc, sizeof(proc));
- + if (proc.pid == pid && proc.ppid <= 0) {
- + initpid = pid;
- + break;
- + }
- + }
- + }
- + closedir(procdir);
- + }
- +
- + if (kill(initpid, SIGTERM) == -1)
- + perror("kill");
- +#else
- if (kill(1, SIGTERM) == -1)
- perror("kill");
- +#endif
-
- sleep(1);
- }
- diff -ru .b/init/init.c ./init/init.c
- --- .b/init/init.c Thu Sep 2 14:52:40 1993
- +++ ./init/init.c Wed Sep 1 14:54:54 1993
- @@ -46,6 +46,7 @@
- #ifdef MINT
- #include <ioctl.h>
- #include <sys/dir.h>
- +#include <sys/stat.h>
- #include <mintbind.h>
-
- extern char *strchr();
- @@ -59,6 +60,7 @@
- static int shutdown = 0;
- static int exit_anyway = 0;
- static int times_up = 0;
- +static int updatepid = 0;
-
- int flags;
-
- @@ -364,6 +366,14 @@
- printf("Syncing file systems...");
- fflush(stdout);
-
- +#ifdef MINT
- + /* sync minixfs... */
- + if (updatepid) {
- + kill (updatepid, SIGALRM);
- + sleep (5);
- + }
- +#endif
- +
- #ifdef SYNC_FILESYS
- sync();
- sync();
- @@ -417,10 +427,21 @@
- {
- while ((entry = readdir(procdir)) != NULL)
- {
- + char statf[0x80] = "u:/proc/";
- + struct stat st;
- +
- entry->d_name[entry->d_namlen] = '\0';
- pointer = strchr(entry->d_name, '.');
- sscanf(++pointer, "%3d", &pid);
- - if ((pid != getpid()) && (pid != 0))
- + if (!updatepid && pid < getpid() && !strncmp
- + (entry->d_name, "update.", pointer-1-entry->d_name))
- + updatepid = pid;
- +
- + /* don't wait() for update or TSRs... -nox */
- + strcpy (statf+sizeof "u:/proc", entry->d_name);
- + if ((pid != getpid()) && (pid != 0) &&
- + (pid != updatepid) && !stat (statf, &st) &&
- + !(st.st_attr & FA_HIDDEN))
- {
- num_procs++;
- switch (first_time)
- diff -ru .b/syslog/syslogd.c ./syslog/syslogd.c
- --- .b/syslog/syslogd.c Tue Aug 10 00:07:46 1993
- +++ ./syslog/syslogd.c Thu Sep 2 14:39:28 1993
- @@ -134,6 +134,7 @@
- char ctty[] = CTTY;
-
- #ifdef atarist
- +#include <setjmp.h>
- #include <osbind.h>
- char *PipeName = "\\pipe\\log";
- #endif
- @@ -281,6 +282,22 @@
- extern char *sys_errlist[];
- extern char *ctime(), *index(), *calloc();
-
- +#ifdef atarist
- +/* on MiNT fork and vfork both block until the child does either exec or
- + dies. only tfork doesn't block but it works like a subroutine call... */
- +static jmp_buf tforkj;
- +
- +static int in_tfork(arg)
- +int arg;
- +{
- + /* wait for parent to die before we can longjmp back */
- + while (getppid () > 1)
- + sleep (1);
- + longjmp (tforkj, 1);
- + /*NOTREACHED*/
- +}
- +#endif
- +
- main(argc, argv)
- int argc;
- char **argv;
- @@ -327,6 +344,11 @@
- #ifndef atarist
- if (fork())
- exit(0);
- +#else
- + /* hack until MiNT gets a real nonblocking fork... one day :)
- + */
- + if (!setjmp(tforkj) && tfork (in_tfork, 0) >= 0)
- + _exit (0);
- #endif
- #ifdef SYSV
- sleep(5); /* Why wont it work without this?! -- ASP */
- --
- J"urgen Lock / nox@jelal.north.de / UUCP: ..!uunet!unido!uniol!jelal!nox
- ...ohne Gewehr
- PGP public key fingerprint = 8A 18 58 54 03 7B FC 12 1F 8B 63 C7 19 27 CF DA
-